package com.xishu.util;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.validator.EmailValidator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternUtil {
    /**
     * 判断是否是6位数字
     *
     * @param number
     * @return
     */
    public static boolean isSixNumber(String number) {
        String regEx = "[0-9]{6,6}";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(String.valueOf(number));
        return matcher.find();
    }

    /**
     * 判断是否是电话号码
     *
     * @param phoneNumber
     * @return
     */
    public static boolean isPhoneNumber(String phoneNumber) {
        String regEx = "^[0-9]{11,11}$";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(String.valueOf(phoneNumber));
        return matcher.find();
    }

    /**
     * 判断是否全是数字
     *
     * @param phone
     * @return
     */
    public static boolean isAllNumber(String phone) {
        if (phone == null || phone.length() == 0) {
            return false;
        }

        try {
            Long.parseLong(phone);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 是否含有数字
     *
     * @param input
     * @return
     */
    public static boolean isHaveNumber(String input) {
        String regEx = "[0-9]{1,}";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(input);
        return matcher.find();
    }

    /**
     * 是否含有小写字母
     *
     * @param input
     * @return
     */
    public static boolean isHaveLowCase(String input) {
        String regEx = "[a-z]{1,}";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(input);
        return matcher.find();
    }

    /**
     * 是否含有大写字母
     *
     * @param input
     * @return
     */
    public static boolean isHaveUpperCase(String input) {
        String regEx = "[A-Z]{1,}";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(input);
        return matcher.find();
    }

    /**
     * 密码规则，
     * 不为空
     * 必须含有数字
     * 必须含有小写字母
     * 必须含有大写字母
     *
     * @param input
     * @return
     */
    public static boolean isPassword(String input) {

        if (StringUtils.isEmpty(input)) {
            return false;
        }

        if (!isHaveNumber(input)) {
            return false;
        }

        //即没有大写字母，也没有小写字母
        if (!isHaveLowCase(input) && !isHaveLowCase(input)) {
            return false;
        }

        if (input.length() < 8) {
            return false;
        }

        return true;
    }

    /**
     * 判断是否是mongdb的ID格式
     *
     * @param str
     * @return
     */
    public static boolean isMongoId(String str) {
        if (StringUtils.isEmpty(str)) {
            return false;
        }

        //没有24位，也返回
        if (str.length() != 24) {
            return false;
        }

        //最后判断格式

        //必须包含数字
        if (!isHaveNumber(str)) {
            return false;
        }

        //必须包含小写字母
        if (!isHaveLowCase(str)) {
            return false;
        }

        return true;

    }

    /**
     * 是否是时间格式
     *
     * @param date
     * @return
     */
    public static boolean isDate(String date) {
        String regEx = "[0-9]{,4}-[0-9]{,2}-[0-9]{,2}";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(date);
        return matcher.find();
    }

    /**
     * 判断是否是身份证号码，只校验了基本格式
     *
     * @param idCard
     * @return
     */
    public static boolean isIdCard(String idCard) {
        String REGEX_ID_CARD = "(^\\d{17}[0-9a-zA-Z]$)";
        boolean matches = Pattern.matches(REGEX_ID_CARD, idCard);

        //已经匹配了，直接返回
        if (matches) {
            return true;
        }

        REGEX_ID_CARD = "(^\\d{14}[0-9a-zA-Z]$)";

        return Pattern.matches(REGEX_ID_CARD, idCard);
    }

    /**
     * 判断是否是邮箱地址
     *
     * @param email
     * @return
     */
    public static boolean isEmail(String email) {
        return EmailValidator.getInstance().isValid(email);
    }
}
